﻿using Stankovita.Model;
using System;
using System.Security.Cryptography;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Navigation;

namespace Stankovita.Program.Pages
{
    /// <summary>
    /// Логика взаимодействия для SignInOut.xaml
    /// </summary>
    public partial class SignInOut : Page
    {

        public SignInOut()
        {
            InitializeComponent();
            
            // Выбор конфигурации в зависимости от пользователя
            switch (GlobalVaribles.typeUser)
            {
                case 1: // заказчик
                    gridFormAuthCustomer.Visibility = Visibility.Visible;    
                    break;
                case 2: // админ
                    gridFormAuthАdmin.Visibility = Visibility.Visible;
                    break;
            }
        }

        // Назад в режим подключения
        private void BackBtn_Click(object sender, RoutedEventArgs e)
        {
            gridFormAuthCustomer.Visibility = Visibility.Hidden;
            gridFormAuthАdmin.Visibility = Visibility.Hidden;
            GridFormRegCustomer.Visibility = Visibility.Hidden;
            NavigationService.GoBack();
        }

        // Авторизация заказчика
        private void AuthCustomerBtn_Click(object sender, RoutedEventArgs e)
        {
            // Переменные для MessageBox
            string m_aut = "Аутентификация";
            string m_errorincor = "Ошибка! Логин не верный!";

            if (CustomerLoginAuthTxb.Text != "" && CustomerLoginAuthTxb.Text != null ||
                CustomerPassAuthPbx.Password != "" && CustomerPassAuthPbx.Password != null)
            {
                string Login = CustomerLoginAuthTxb.Text;
                string Pass = Hash_SHA1(CustomerPassAuthPbx.Password);

                bool flag = false;

                // Просмотр записей в таблице
                foreach (var record in Entities.GetContext().Customers)
                {
                    if (Login == record.login)
                    {
                        flag = true;
                        if (Pass == record.pass)
                        {
                            GlobalVaribles.nameUser = Login + $" ({record.nameOrganiz})";
                            GlobalVaribles.timeLogin = DateTime.Now;
                            NavigationService.Navigate(new View());
                            break;
                        }
                        else
                        {
                            MessageBox.Show("Логин правильный, но пароль неверный.\nДля доступа к интерфейсу на '10 СЕКУНД' введите капчу!");
                            CaptchaLb.Text = GenerateCaptcha();
                            GridCaptcha.Visibility = Visibility.Visible;
                        }
                    }
                }

                if (!flag)
                    // Если пользователь не существует
                    MessageBox.Show(m_errorincor, m_aut, MessageBoxButton.OK, MessageBoxImage.Error);
                
            }
            else
                // Если данные в полях пустые
                MessageBox.Show("Данные в полях пустые!", m_aut, MessageBoxButton.OK, MessageBoxImage.Warning);
        }

        // Проверка введенной капчи
        private void CheckCaptchaBtn_Click(object sender, RoutedEventArgs e)
        {
            string Login = CustomerLoginAuthTxb.Text;

            if (CaptchaLb.Text == InputCaptchaTxb.Text)
            {
                GridCaptcha.Visibility = Visibility.Hidden;
                GlobalVaribles.nameUser = Login + " (CAPTCHA LOGIN)";
                GlobalVaribles.captchaLogin = true;
                GlobalVaribles.timeLogin = DateTime.Now;
                MessageBox.Show("Капча верная.\nВам разрешен доступ к интерфейсу на 10 секунд");
                NavigationService.Navigate(new View());
            }
            else
            {
                MessageBox.Show("Капча не верная.\nПопробуйте еще раз!");

                CaptchaLb.Text = GenerateCaptcha();
            }
        }

        // Генерация капчи
        public string GenerateCaptcha()
        {
            Random rand = new Random();
            int num = rand.Next(4, 6);
            string captcha = "";
            int totl = 0;

            do
            {
                int chr = rand.Next(48, 123);
                if ((chr >= 48 && chr <= 57) || (chr >= 65 && chr <= 99) || (chr >= 97 && chr <= 122))
                {
                    captcha += (char)chr;
                    totl++;
                    if (totl == num)
                        break;
                }
            } while (true);

            return captcha;
        }

        // Открыть страницу регистрации заказчика
        private void OpenRegCustomerBtn_Click(object sender, RoutedEventArgs e)
        {
            gridFormAuthCustomer.Visibility = Visibility.Hidden;
            GridFormRegCustomer.Visibility = Visibility.Visible;
        }

        // Получение ХЭША пароля
        public string Hash_SHA1(string password)
        {
            using (SHA1Managed sha1 = new SHA1Managed())
            {
                var hash = sha1.ComputeHash(Encoding.UTF8.GetBytes(password));
                var sb = new StringBuilder(hash.Length * 2);

                foreach (byte b in hash)
                {
                    sb.Append(b.ToString("X2"));
                }
                return sb.ToString();
            }
        }

        // Регистрация заказчика
        private void RegCustomerBtn_Click(object sender, RoutedEventArgs e)
        {
            // Предварительная проверка
            StringBuilder errors = new StringBuilder();

            if (string.IsNullOrWhiteSpace(customerNameRegTxb.Text))
                errors.AppendLine("* Отсутствует название организации!");
            if (string.IsNullOrWhiteSpace(customerLoginRegTxb.Text))
                errors.AppendLine("* Не указан логин!");
            foreach (var record in Entities.GetContext().Customers)
            {
                if (customerLoginRegTxb.Text == record.login)
                    errors.AppendLine("* Такой логин уже существует!");
            }
            if (string.IsNullOrWhiteSpace(customerPassRegPbx.Password))
                errors.AppendLine("* Не указан пароль!");
            if (string.IsNullOrWhiteSpace(customerEmailRegTxb.Text))
                errors.AppendLine("* Не указана почта!");

            // Если есть ошибки, то вывести это
            if (errors.Length > 0)
            {
                MessageBox.Show(errors.ToString());
                return;
            }

            // Добавление нового заказчика
            var customer = new Customers
            {
                nameOrganiz = customerNameRegTxb.Text,
                login = customerLoginRegTxb.Text,
                pass = Hash_SHA1(customerPassRegPbx.Password),
                email = customerEmailRegTxb.Text
            };

            Entities.GetContext().Customers.Add(customer);

            try
            {
                Entities.GetContext().SaveChanges();
                MessageBox.Show("Данные сохранены");
                GridFormRegCustomer.Visibility = Visibility.Hidden;
                gridFormAuthCustomer.Visibility = Visibility.Visible;
            }
            catch (Exception ex)
            { MessageBox.Show(ex.Message); }
        }

        // Авторизация админа
        private void AuthAdminBtn_Click(object sender, RoutedEventArgs e)
        {
            // Переменные для MessageBox
            string m_aut = "Аутентификация";
            string m_errorincor = "Ошибка! Логин не верный!";

            if (adminLoginAuthTxb.Text != "" && adminLoginAuthTxb.Text != null ||
                adminPassAuthPbx.Password != "" && adminPassAuthPbx.Password != null)
            {
                string Login = adminLoginAuthTxb.Text;
                string Pass = adminPassAuthPbx.Password;

                bool flag = false;

                // Просмотр записей в таблице
                foreach (var record in Entities.GetContext().Admins)
                {
                    if (Login == record.login)
                    {
                        if (Pass == record.pass)
                        {
                            flag = true;
                            GlobalVaribles.nameUser = Login;
                            GlobalVaribles.timeLogin = DateTime.Now;
                            NavigationService.Navigate(new View());
                            break;
                        }
                    }
                }

                if (!flag)
                    // Если пользователь не существует
                    MessageBox.Show(m_errorincor, m_aut, MessageBoxButton.OK, MessageBoxImage.Error);
            }
            else
                // Если данные в полях пустые
                MessageBox.Show("Данные в полях пустые!", m_aut, MessageBoxButton.OK, MessageBoxImage.Warning);
        }
    }
}
